/**
 * @description Viewer配置参数管理模块，提供默认配置和配置验证功能
 */

import * as Cesium from "cesium";

/**
 * 版本号
 * @type {string}
 */
export const version = '1.0.0';

/**
 * 默认相机朝向配置
 * @type {Object}
 * @property {number} heading - 方向角（度），0表示朝向正北
 * @property {number} pitch - 俯仰角（度），负值表示向下看，-90表示垂直向下
 * @property {number} roll - 横滚角（度），通常保持为0
 */
export const DefaultOrientation = {
  heading: 0, // 方向角（度），0表示朝向正北
  pitch: -90, // 俯仰角（度），负值表示向下看
  roll: 0, // 横滚角（度），通常保持为0
};

/**
 * 默认屏幕空间相机控制器配置
 * @type {Object}
 * @property {boolean} enableRotate - 是否启用旋转
 * @property {boolean} enableTranslate - 是否启用平移
 * @property {boolean} enableZoom - 是否启用缩放
 * @property {boolean} enableTilt - 是否启用倾斜
 * @property {boolean} enableLook - 是否启用环顾
 * @property {number} minimumZoomDistance - 最小缩放距离
 * @property {number} maximumZoomDistance - 最大缩放距离
 * @property {number} zoomFactor - 缩放因子
 * @property {number} minimumCollisionTerrainHeight - 最小碰撞地形高度
 */
export const DefaultScreenSpaceCameraController = {
  enableRotate: true,
  enableTranslate: true,
  enableZoom: true,
  enableTilt: true,
  enableLook: true,
  minimumZoomDistance: 1,
  maximumZoomDistance: 50000000.0,
  zoomFactor: 3.0,
  minimumCollisionTerrainHeight: 80000.0,
};

/**
 * 默认Viewer配置参数
 * @type {Object}
 * @property {boolean} animation - 是否显示动画控件
 * @property {boolean} baseLayerPicker - 是否显示图层选择器
 * @property {boolean} fullscreenButton - 是否显示全屏按钮
 * @property {boolean} vrButton - 是否显示VR按钮
 * @property {boolean} geocoder - 是否显示地理编码器
 * @property {boolean} homeButton - 是否显示主页按钮
 * @property {boolean} infoBox - 是否显示信息框
 * @property {boolean} sceneModePicker - 是否显示场景模式选择器
 * @property {boolean} selectionIndicator - 是否显示选择指示器
 * @property {boolean} timeline - 是否显示时间线
 * @property {boolean} navigationHelpButton - 是否显示导航帮助按钮
 * @property {boolean} navigationInstructionsInitiallyVisible - 导航指令是否初始可见
 * @property {boolean} scene3DOnly - 是否仅使用3D场景模式
 * @property {boolean} credit - 是否显示版权信息
 * @property {boolean} requestRenderMode - 是否启用请求渲染模式
 * @property {number} maximumRenderTimeChange - 最大渲染时间变化量
 * @property {Cesium.Globe} globe - 地球对象配置
 */
export const DefaultViewerOptions = {
  // 界面控制选项
  animation: false,
  baseLayerPicker: true,
  fullscreenButton: false,
  vrButton: false,
  geocoder: false,
  homeButton: true,
  infoBox: true,
  sceneModePicker: true,
  selectionIndicator: false,
  timeline: false,
  navigationHelpButton: false,
  navigationInstructionsInitiallyVisible: false,
  scene3DOnly: false,
  credit: false,
  // 地球选项
  globe: new Cesium.Globe(Cesium.Ellipsoid.WGS84),
  fps: true,
  // 版权信息选项
  copyright: true,
  // 地图工具栏选项
  toolbarPosition: "top-right",
};

/**
 * 常用的地图中心点配置
 * @type {Object}
 * @property {Cesium.Cartesian3} CHINA - 中国中心点，高度20000000米
 * @property {Cesium.Cartesian3} BEIJING - 北京中心点，高度2000000米
 * @property {Cesium.Cartesian3} SHANGHAI - 上海中心点，高度2000000米
 * @property {Cesium.Cartesian3} GLOBAL - 全球视图中心点，高度40000000米
 */
export const PresetCenters = {
  /** 中国中心点 */
  CHINA: Cesium.Cartesian3.fromDegrees(104.195397, 35.86166, 20000000),
  /** 北京中心点 */
  BEIJING: Cesium.Cartesian3.fromDegrees(116.397428, 39.90923, 2000000),
  /** 上海中心点 */
  SHANGHAI: Cesium.Cartesian3.fromDegrees(121.473701, 31.230416, 2000000),
  /** 全球视图 */
  GLOBAL: Cesium.Cartesian3.fromDegrees(0, 0, 40000000),
};

/**
 * Viewer配置对象验证结果
 * @typedef {Object} ValidatedViewerOptions
 * @property {Object} globe - 地球对象配置
 * @property {boolean} animation - 是否显示动画控件
 * @property {boolean} baseLayerPicker - 是否显示图层选择器
 * @property {boolean} fullscreenButton - 是否显示全屏按钮
 * @property {boolean} vrButton - 是否显示VR按钮
 * @property {boolean} geocoder - 是否显示地理编码器
 * @property {boolean} homeButton - 是否显示主页按钮
 * @property {boolean} infoBox - 是否显示信息框
 * @property {boolean} sceneModePicker - 是否显示场景模式选择器
 * @property {boolean} selectionIndicator - 是否显示选择指示器
 * @property {boolean} timeline - 是否显示时间线
 * @property {boolean} navigationHelpButton - 是否显示导航帮助按钮
 * @property {boolean} navigationInstructionsInitiallyVisible - 导航指令是否初始可见
 * @property {boolean} credit - 是否显示版权信息
 * @property {boolean} fps - 是否显示帧率
 * @property {boolean} copyright - 是否显示版权信息
 * @property {string} toolbarPosition - 地图工具栏位置
 */

/**
 * 验证并标准化Viewer配置参数
 * @param {Object} [options={}] - 输入的配置参数
 * @returns {ValidatedViewerOptions} 验证并标准化后的配置参数
 * @example
 * // 验证用户提供的选项，如无效则返回默认值
 * const validOptions = validateViewerOptions(userProvidedOptions);
 */
export function validateViewerOptions(options) {
  if (!options || typeof options !== "object") {
    return DefaultViewerOptions;
  }
  const validatedOptions = { ...DefaultViewerOptions, ...options };
  return validatedOptions;
}

/**
 * 相机配置选项
 * @typedef {Object} CameraOption
 * @property {Cesium.Cartesian3} destination - 相机目标位置
 * @property {Object} orientation - 相机朝向
 * @property {number} orientation.heading - 方向角（度）
 * @property {number} orientation.pitch - 俯仰角（度）
 * @property {number} orientation.roll - 横滚角（度）
 */

/**
 * 带相机配置的Viewer选项
 * @typedef {Object} CameraConfiguredViewerOptions
 * @property {Object} globe - 地球对象配置
 * @property {boolean} animation - 是否显示动画控件
 * @property {boolean} baseLayerPicker - 是否显示图层选择器
 * @property {boolean} fullscreenButton - 是否显示全屏按钮
 * @property {boolean} vrButton - 是否显示VR按钮
 * @property {boolean} geocoder - 是否显示地理编码器
 * @property {boolean} homeButton - 是否显示主页按钮
 * @property {boolean} infoBox - 是否显示信息框
 * @property {boolean} sceneModePicker - 是否显示场景模式选择器
 * @property {boolean} selectionIndicator - 是否显示选择指示器
 * @property {boolean} timeline - 是否显示时间线
 * @property {boolean} navigationHelpButton - 是否显示导航帮助按钮
 * @property {boolean} navigationInstructionsInitiallyVisible - 导航指令是否初始可见
 * @property {boolean} credit - 是否显示版权信息
 * @property {CameraOption} cameraOption - 相机配置选项
 */

/**
 * 创建带相机配置的Viewer选项
 * @param {Cesium.Cartesian3|Array<number>|string} center - 地图中心点（可以是Cartesian3对象、经纬度数组[lon, lat, height]或预设中心点ID）
 * @param {Object} [options={}] - 其他Viewer配置项
 * @returns {CameraConfiguredViewerOptions} 包含相机配置的Viewer选项
 * @example
 * // 创建以中国为中心的Viewer配置
 * const options = createCameraConfiguredViewerOptions('CHINA', {
 *   baseLayerPicker: true
 * });
 *
 * // 使用经纬度数组设置中心点
 * const options = createCameraConfiguredViewerOptions([116.4, 39.9, 1000000]);
 */
export function createCameraConfiguredViewerOptions(center, options = {}) {
  const viewerOptions = validateViewerOptions(options);

  // 处理中心点配置
  let cameraPosition;

  if (center instanceof Cesium.Cartesian3) {
    // 直接使用Cartesian3对象
    cameraPosition = center;
  } else if (Array.isArray(center) && center.length >= 2) {
    // 处理经纬度数组 [lon, lat, height]
    const height = center.length > 2 ? center[2] : 1000000;
    cameraPosition = Cesium.Cartesian3.fromDegrees(
      center[0],
      center[1],
      height
    );
  } else if (
    typeof center === "string" &&
    PRESET_CENTERS[center.toUpperCase()]
  ) {
    // 使用预设中心点
    cameraPosition = PRESET_CENTERS[center.toUpperCase()];
  }

  // 创建cameraOption对象
  if (cameraPosition) {
    viewerOptions.cameraOption = {
      destination: cameraPosition,
      orientation: DefaultOrientation,
    };
  }

  return viewerOptions;
}

/**
 * 性能优化的Viewer配置接口
 * @typedef {Object} PerformanceOptimizedOptions
 * @property {Object} globe - 地球对象配置
 * @property {boolean} animation - 是否显示动画控件
 * @property {boolean} baseLayerPicker - 是否显示图层选择器
 * @property {boolean} fullscreenButton - 是否显示全屏按钮
 * @property {boolean} vrButton - 是否显示VR按钮
 * @property {boolean} geocoder - 是否显示地理编码器
 * @property {boolean} homeButton - 是否显示主页按钮
 * @property {boolean} infoBox - 是否显示信息框
 * @property {boolean} sceneModePicker - 是否显示场景模式选择器
 * @property {boolean} selectionIndicator - 是否显示选择指示器
 * @property {boolean} timeline - 是否显示时间线
 * @property {boolean} navigationHelpButton - 是否显示导航帮助按钮
 * @property {boolean} navigationInstructionsInitiallyVisible - 导航指令是否初始可见
 * @property {boolean} scene3DOnly - 仅使用3D场景模式，提高性能
 * @property {boolean} credit - 是否显示版权信息
 * @property {boolean} requestRenderMode - 启用请求渲染模式，减少不必要的渲染
 * @property {number} maximumRenderTimeChange - 最大渲染时间变化量，较低的值提高性能，此处设置为0.2
 * @property {boolean} useBrowserRecommendedResolution - 是否使用浏览器推荐分辨率，此处禁用以提高性能
 * @property {boolean} orderIndependentTranslucency - 禁用独立于顺序的半透明，降低GPU要求
 * @property {Object} contextOptions - WebGL上下文选项配置，包含alpha、depth、stencil、antialias等性能相关选项
 */

/**
 * 获取推荐的性能优化配置
 * @returns {PerformanceOptimizedOptions} 性能优化后的Viewer配置
 * @example
 * // 创建高性能模式的Viewer实例
 * const viewer = new Cesium.Viewer('cesiumContainer', getPerformanceOptimizedOptions());
 */
export function getPerformanceOptimizedOptions() {
  /**
   * @type {PerformanceOptimizedOptions}
   */
  return {
    ...DefaultViewerOptions,
    // 性能优化选项
    requestRenderMode: true,
    maximumRenderTimeChange: 0.2,
    // 禁用不必要的功能
    useBrowserRecommendedResolution: false,
    orderIndependentTranslucency: false,
    contextOptions: {
      webgl: {
        alpha: false,
        depth: true,
        stencil: false,
        antialias: false,
        premultipliedAlpha: true,
        preserveDrawingBuffer: false,
        failIfMajorPerformanceCaveat: true,
      },
    },
  };
}

/**
 * 导出默认配置对象
 */
export default {
  DefaultViewerOptions,
  DefaultOrientation,
  DefaultScreenSpaceCameraController,
  PresetCenters,
  validateViewerOptions,
  createCameraConfiguredViewerOptions,
  getPerformanceOptimizedOptions,
  version,
};
